package hibernate.dao;

import hibernate.entity.Produto;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

public class ProdutoDAO {
	
	private Session session;	

	public void adiciona(Produto produto){		
		
		HibernateConnection.buildSessionFactory();
		session = HibernateConnection.openSession();		
		Transaction transaction = session.beginTransaction();
				
    	try{
			session.save(produto);
			transaction.commit();
		} catch(Exception e){
			if(transaction != null)
				transaction.rollback();
		    System.out.println("Erro: " + e);
		} finally {
			HibernateConnection.closeSessionFactory();
			session.clear();
			session.close();
		}			
	}	

	public void altera(Produto produto){		
		
		HibernateConnection.buildSessionFactory();
		session = HibernateConnection.openSession();		
		Transaction transaction = session.beginTransaction();
				
    	try{
			session.update(produto);
			transaction.commit();
		} catch(Exception e){
			if(transaction != null)
				transaction.rollback();
		    System.out.println("Erro: " + e);
		} finally {
			HibernateConnection.closeSessionFactory();
			session.clear();
			session.close();
		}
	}	

	public void remove(Produto produto){
		
		HibernateConnection.buildSessionFactory();
		session = HibernateConnection.openSession();		
		Transaction transaction = session.beginTransaction();
				
    	try{
			session.delete(produto);
			transaction.commit();
		} catch(Exception e){
			if(transaction != null)
				transaction.rollback();
		    System.out.println("Erro: " + e);
		} finally {
			HibernateConnection.closeSessionFactory();
			session.clear();
			session.close();
		}	
	}	
	
	public Produto importaProdutoPorNomeEMarca(String nomeProduto, String marcaProduto){
		
		HibernateConnection.buildSessionFactory();
		session = HibernateConnection.openSession();			
		Criteria criteria = session.createCriteria(Produto.class);
		Produto produto = null;
		
    	try{
    		criteria.add(Restrictions.eq("nomeProduto", nomeProduto));
    		criteria.add(Restrictions.eq("marca", marcaProduto));
    		produto = (Produto) criteria.uniqueResult();
		} catch(Exception e){
		    System.out.println("Erro: " + e);
		} finally {
			HibernateConnection.closeSessionFactory();
			session.clear();
			session.close();
		}			
		
		return produto;
	}
	
	public Produto importaProdutoPorId(long id){
		
		HibernateConnection.buildSessionFactory();
		session = HibernateConnection.openSession();			
		Criteria criteria = session.createCriteria(Produto.class);
		Produto produto = null;
		
    	try{
    		criteria.add(Restrictions.eq("id", id));
    		produto = (Produto) criteria.uniqueResult();
		} catch(Exception e){
		    System.out.println("Erro: " + e);
		} finally {
			HibernateConnection.closeSessionFactory();
			session.clear();
			session.close();
		}			
		
		return produto;
	}
	
	public List<Produto> getListaProdutos(){
		
		HibernateConnection.buildSessionFactory();
		session = HibernateConnection.openSession();			
		Criteria criteria = session.createCriteria(Produto.class);		
		List<Produto> listaProdutos = null;
		
    	try{
			listaProdutos = (List<Produto>) criteria.list();
		} catch(Exception e){
		    System.out.println("Erro: " + e);
		} finally {
			HibernateConnection.closeSessionFactory();
			session.clear();
			session.close();
		}			
		return listaProdutos;		
	}	
	
	public List<Produto> getListaProdutosCompras(){
		
		HibernateConnection.buildSessionFactory();
		session = HibernateConnection.openSession();			
		Criteria criteria = session.createCriteria(Produto.class);		
		List<Produto> listaProdutos = null;
		
    	try{
    		criteria.setFetchMode("produtosItemCompra", FetchMode.JOIN);
			listaProdutos = (List<Produto>) criteria.list();
		} catch(Exception e){
		    System.out.println("Erro: " + e);
		} finally {
			HibernateConnection.closeSessionFactory();
			session.clear();
			session.close();
		}			
		return listaProdutos;		
	}
	
	public List<Produto> getListaProdutoEstoque(){
		
		HibernateConnection.buildSessionFactory();
		session = HibernateConnection.openSession();			
		Criteria criteria = session.createCriteria(Produto.class);		
		List<Produto> listaProdutos = null;
		
    	try{
    		criteria.setFetchMode("estoques", FetchMode.JOIN);
			listaProdutos = (List<Produto>) criteria.list();
		} catch(Exception e){
		    System.out.println("Erro: " + e);
		} finally {
			HibernateConnection.closeSessionFactory();
			session.clear();
			session.close();
		}			
		return listaProdutos;			
	}
}
